/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.siseventos.dao;

import br.siseventos.dao.util.HibernateUtil;
import br.siseventos.model.*;
import br.siseventos.model.util.EnumHelper;
import br.siseventos.service.ItemAvaliacaoEventoService;
import br.siseventos.service.PublicoEventoService;
import br.siseventos.service.PublicoService;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

public class EventoDao extends BaseDao<TbEvento> implements Serializable {

    //<editor-fold desc="Campos">
    private PublicoEventoService publicoEventoService = new PublicoEventoService();
    private ItemAvaliacaoEventoService avaliacaoEventoService = new ItemAvaliacaoEventoService();
    // </editor-fold>
    // <editor-fold desc="Construtor">

    public EventoDao() {
        super();
    }

    // </editor-fold>
    // <editor-fold desc="Extensão">
    public List<TbEvento> consultar(Date dataInicio, Date dataTermino) throws Exception {
        Session sessao = HibernateUtil.getSession();
        Transaction t = null;
        List<TbEvento> l = null;
        try {
            t = sessao.beginTransaction();
            Criteria c = sessao.createCriteria(TbEvento.class);
            // Adicionado os criterios da pesquisa por data
            if (dataInicio != null && dataTermino != null) {
                c.add(Restrictions.between("dtaInicioEvento", dataInicio, dataTermino));
            } else if (dataInicio != null && dataTermino == null) {
                c.add(Expression.or(Restrictions.eq("dtaInicioEvento", dataInicio), Restrictions.gt("dtaInicioEvento", dataInicio)));
            } else if (dataInicio == null && dataTermino != null) {
                c.add(Expression.or(Restrictions.eq("dtaTerminoEvento", dataTermino), Restrictions.lt("dtaTerminoEvento", dataTermino)));
            }
            // Retornar mais recentes primeiro
            c.addOrder(Order.desc("dtaInicioEvento"));
            l = (List<TbEvento>) c.list();
            t.commit();
        } catch (Exception e) {
            if (t != null) {
                try {
                    t.rollback();
                } catch (Exception ex) {
                    throw ex;
                }
            }
        } finally {
            if (sessao != null) {
                sessao.close();
            }
        }
        return l;
    }

    public List<TbEvento> consultarPorNome(String nome, EnumHelper.FlagTipoConsulta tipoConsulta) throws Exception {
        Session sessao = HibernateUtil.getSession();
        List<TbEvento> lista = null;
        Transaction t = null;
        try {
            t = sessao.beginTransaction();
            Criteria c = sessao.createCriteria(TbEvento.class);
            switch (tipoConsulta) {
                case StartsWith:
                    c.add(Restrictions.like("nmeEvento", nome + "%"));
                    break;
                case EndsWith:
                    c.add(Restrictions.like("nmeEvento", "%" + nome));
                    break;
                case Contains:
                    c.add(Restrictions.like("nmeEvento", "%" + nome + "%"));
                    break;
                case Full:
                    c.add(Restrictions.or(Restrictions.like("nmeEvento", nome + "%"),
                            Restrictions.like("nmeEvento", "%" + nome),
                            Restrictions.like("nmeEvento", "%" + nome + "%")));
                    break;
            }
            // Retornar mais recentes primeiro
            c.addOrder(Order.desc("dtaInicioEvento"));
            lista = (List<TbEvento>) c.list();
            t.commit();
        } catch (Exception e) {
            if (t != null) {
                try {
                    t.rollback();
                } catch (Exception ex) {
                    throw ex;
                }
            }
        } finally {
            if (sessao != null) {
                sessao.close();
            }
        }
        return lista;
    }

    public List<TbEvento> consultarPorStatus(EnumHelper.EnumStatusEvento[] statusEvento) throws Exception {
        Session sessao = HibernateUtil.getSession();
        List<TbEvento> lista = null;
        Transaction t = null;
        try {
            t = sessao.beginTransaction();
            Criteria c = sessao.createCriteria(TbEvento.class);
            for (EnumHelper.EnumStatusEvento e : statusEvento) {
                c.add(Restrictions.eq("stsEvento", e.getStatusChar()));
            }
            // Retornar mais recentes primeiro
            c.addOrder(Order.desc("dtaInicioEvento"));
            lista = (List<TbEvento>) c.list();
            t.commit();
        } catch (Exception e) {
            if (t != null) {
                try {
                    t.rollback();
                } catch (Exception ex) {
                    throw ex;
                }
            }
        } finally {
            if (sessao != null) {
                sessao.close();
            }
        }
        return lista;
    }

    /* public Long incluir(TbEvento evento, List<TbPublico> publicos, List<TdItemAvaliacao> itensAvaliacao) throws Exception {
        Session sessao = HibernateUtil.getSession();
        Long id = null;
        Transaction t = null;
        try {
            t = sessao.beginTransaction();
            id = Long.parseLong(((Integer) sessao.save(evento)).toString());
            for (TbPublico p : publicos) {
                publicoEventoService.incluir(new TaPublicoEvento(evento, p));
            }
            for (TdItemAvaliacao a : itensAvaliacao) {
                avaliacaoEventoService.incluir(new TaItemAvaliacaoEvento(evento, a));
            }
            t.commit();
        } catch (Exception e) {
            if (t != null) {
                try {
                    t.rollback();
                } catch (Exception ex) {
                    throw ex;
                }
            }
        } finally {
            if (sessao != null) {
                sessao.close();
            }
        }
        return id;
    } */
    // </editor-fold>
    // <editor-fold desc="Static Getter">
    // </editor-fold>
}
